package com.qigao.mall.service.impl;

import com.qigao.mall.api.MerchantEnterService;
import com.qigao.mall.commons.dto.MerEnterApplyDto;
import com.qigao.mall.commons.dto.MerInfoDto;
import com.qigao.mall.commons.dto.OpenShopDto;
import com.qigao.mall.commons.enums.*;
import com.qigao.mall.commons.exceptions.BusinessException;
import com.qigao.mall.commons.utils.IDUtils;
import com.qigao.mall.jdbc.mapper.TbMerInfoMapper;
import com.qigao.mall.jdbc.model.TbMerInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;

@Service
public class MerchantEnterServiceImpl implements MerchantEnterService {
    private static final Logger logger= LoggerFactory.getLogger(MerchantEnterServiceImpl.class);
    @Resource
    private TbMerInfoMapper merInfoMapper;
    //小微商户进件不支持的银行卡前缀
    @Value("${weichat.bankcard.prix}")
    private String weichatBankCardPrix;

    @Override
    public Result apply(MerEnterApplyDto merEnterApplyDto) {
        //1.字段校验
        validField(merEnterApplyDto);
        //2.入库
        saveMerEnter(merEnterApplyDto);
        //3.发送请求

        //4.更新状态
        updateMerStatus();
        return Result.newSuccess();
    }

    @Override
    public MerInfoDto findByMerNo(String merNo) {
        if(StringUtils.isEmpty(merNo))return null;
        TbMerInfo tbMerInfo=merInfoMapper.selectByMerNo(merNo);
        MerInfoDto merInfoDto=new MerInfoDto();
        if(tbMerInfo!=null){
            BeanUtils.copyProperties(tbMerInfo,merInfoDto);
            merInfoDto.setEnterStatusName(EnterStatusEnum.getNameByCode(tbMerInfo.getEnterStatus()));
        }
        return merInfoDto;
    }


    /**
     * 修改进件状态
     */
    private void updateMerStatus() {
        //todo 待实现

    }

    /**
     *保存进件信息
     * @param merEnterApplyDto
     */
    private void saveMerEnter(MerEnterApplyDto merEnterApplyDto) {
        String idCardNumber= merEnterApplyDto.getIdCardNumber();
        TbMerInfo tbMerInfo=merInfoMapper.selectByIdCardNumber(merEnterApplyDto.getPMerNo(),idCardNumber);
        if(tbMerInfo!=null&& EnterStatusEnum.FAIL.getCode()!=tbMerInfo.getEnterStatus()){
            logger.warn("平台商户号:{},银行卡号:{}进件信息已存在,无须再次处理...", merEnterApplyDto.getPMerNo(),idCardNumber);
            throw new BusinessException(ResultCode.COMMON_DATA_EXISTS);
        }
        if(tbMerInfo!=null){
            updateMerInfo(merEnterApplyDto,tbMerInfo);
            logger.info("平台商户号:{},银行卡号:{}进件信息修改成功!", merEnterApplyDto.getPMerNo(),idCardNumber);
        }else{
            insertMerInfo(merEnterApplyDto);
            logger.info("平台商户号:{},银行卡号:{}进件信息存储成功!", merEnterApplyDto.getPMerNo(),idCardNumber);
        }

    }
    /**
     * 修改商户进件信息
     * @param merEnterApplyDto
     */
    private void updateMerInfo(MerEnterApplyDto merEnterApplyDto, TbMerInfo tbMerInfo) {
        BeanUtils.copyProperties(merEnterApplyDto,tbMerInfo);
        tbMerInfo.setEnterStatus(EnterStatusEnum.PROCESS.getCode());
        tbMerInfo.setBusinessCode(IDUtils.genIdStr(IdTypeEnum.ENTER_SEQ));
        tbMerInfo.setModiNo(merEnterApplyDto.getOperNo());
        tbMerInfo.setModiTime(new Date());
        merInfoMapper.updateByPrimaryKeySelective(tbMerInfo);
    }


    /**
     * 新增商户进件信息
     * @param merEnterApplyDto
     */
    private void insertMerInfo(MerEnterApplyDto merEnterApplyDto) {
        TbMerInfo tbMerInfo=new TbMerInfo();
        BeanUtils.copyProperties(merEnterApplyDto,tbMerInfo);
        tbMerInfo.setMerNo(IDUtils.genIdStr(IdTypeEnum.MER));
        tbMerInfo.setMerName(merEnterApplyDto.getMerchantShortname());
        tbMerInfo.setEnterStatus(EnterStatusEnum.PROCESS.getCode());
        tbMerInfo.setBusinessCode(IDUtils.genIdStr(IdTypeEnum.ENTER_SEQ));
        tbMerInfo.setRate("0.6%");//todo 先写死
        tbMerInfo.setVersion(1);
        tbMerInfo.setCreateNo(merEnterApplyDto.getOperNo());
        tbMerInfo.setCreateTime(new Date());
        tbMerInfo.setModiNo(merEnterApplyDto.getOperNo());
        tbMerInfo.setModiTime(new Date());
        merInfoMapper.insertSelective(tbMerInfo);
    }

    private void validField(MerEnterApplyDto merEnterApplyDto) {
        String[] bankCardPrixArray=weichatBankCardPrix.split(";");
        for(String bankCardPrix:bankCardPrixArray){
            if(merEnterApplyDto.getAccountBank().startsWith(bankCardPrix)){
                throw new BusinessException(ResultCode.BANKCARD_NOT_SUPPORT);
            }
        }
    }
}
